home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
ms_dos
/
data
/
awkscrpt
/
dbgz80.awk
< prev
next >
Wrap
Text File
|
1995-02-11
|
7KB
|
336 lines
BEGIN {
err="/dev/stderr"
printf("\nZ80デバッグファイル作成ツール") >err
printf(" DBGZ80\t\tBy Jouji\n\n") >err
if(tmp=="") tmp="dbgz80.tmp"
if(dbg=="") dbg="dbgz80.dbg"
dat="dbgz80.dat"
em[1]="不正なオペレーションコードが使われている"
em[2]="文法違反"
em[3]="未定義シンボルが使われている"
em[4]="相対ジャンプ先が範囲を越えている"
em[5]="変位の値が範囲を越えている"
em[6]="不正なアドレスが指定されている"
em[7]="シンボルが二重に定義されている"
print "ニーモニックテーブルにデータをセットしています‥‥" >err
oc="^(LD|PUSH|POP|EX|EXX|LDI|LDIR|LDD|LDDR|CPI|CPIR|CPD|CPDR|DAA|CPL|NEG|CCF|SCF|NOP|HALT|DI|EI|ADD|ADC|SUB|SBC|AND|OR|XOR|CP|INC|DEC|RLCA|RLA|RRCA|RRA|RLD|RRD|JP|JR|DJNZ|CALL|RET|RETI|RETN|IN|INI|INIR|IND|INDR|OUT|OUTI|OUTIR|OUTD|OUTDR)$"
r1="^([ABCDEHLIRFZPM]|\\((C|BC|DE|HL|IX|IY|SP)\\)|AF'?|BC|DE|HL|IX|IY|SP|NZ|NC|PO|PE)$"
r2="^([ABCDEHLIR]|\\((C|BC|DE|HL|IX|IY)\\)|AF'|BC|DE|HL|IX|IY|SP)$"
r="^([ABCDEHL]|\\(HL\\))$"
while(getline<dat >0) ob[$1]=$2
FS=",|[ \t]+"
h["0"]=0; h["1"]=1; h["2"]=2; h["3"]=3; h["4"]=4; h["5"]=5; h["6"]=6
h["7"]=7; h["8"]=8; h["9"]=9; h["A"]=10;h["B"]=11;h["C"]=12;h["D"]=13
h["E"]=14;h["F"]=15
for(i=32;i<256;i++) asc[sprintf("%c",i)]=i
print "パス1の処理中‥‥" >err
}
{ ol[NR]=$0
sub(/;.*$/,"")
if($0=="") next
while($0~/'.+'/) {
a=index($0,"'")
s=substr($0,1,a-1)
t=substr($0,a+1)
a=index(t,"'")
u=substr(t,1,a-1)
t=substr(t,a+1)
l=length(u)
v=""
for(i=1;i<=l;i++) {
c=substr(u,i,1)
v=v sprintf("%d,",asc[c])
}
sub(/.$/,"",v)
$0=s v t
}
$0=toupper($0)
}
$1!="" {
sub(/:+$/,"",$1)
if($1 in st) error(7,NR)
st[$1]=addr
}
$2=="EQU" {st[$1]=tonum($3);next}
$2=="ORG" {
a=tonum($3)
if(a<addr) error(6,NR)
addr=a
next
}
$2=="DB" {
for(i=3;i<=NF && $i!="";i++) {
if($i~/^[0-9]/)
printf("%04d D%04X %02X\n",NR,addr,tonum($i)%256) >tmp
else
printf("%04d D%04X @1%s\n",NR,addr,$i) >tmp
addr++
}
next
}
$2=="DW" {
for(i=3;i<=NF && $i!="";i++) {
if($i~/^[0-9]/) {
n=tonum($i)
printf("%04d D%04X %02X\n%04d D%04X %02X\n",
NR,addr++,n%256,NR,addr++,int(n/256)) >tmp
} else {
printf("%04d D%04X @2%s\n",NR,addr,$i) >tmp
addr+=2
}
}
next
}
$2=="DS" {
n=tonum($3)
for(i=1;i<=n;i++) printf("%04d D%04X 00\n",NR,addr++) >tmp
next
}
$2=="END" {exit}
$2=="" {next}
{fl=0;op=$2}
op=="IM" {
printf("%04d I%04X IM %s\n",NR,addr,$3) >tmp
addr+=2
next
}
op=="RST" {
n=tonum($3)
if(n<8) n=8*n
if(n>56 || n%8!=0) error(2,NR)
printf("%04d I%04X RST %02X\n",NR,addr,n) >tmp
addr++
next
}
op=="LD" {
if($3~r && $4~r) {
printf("%04d I%04X LD %s,%s\n",NR,addr,$3,$4) >tmp
addr++
next
}
if($3~r && $4~/^\(I[XY].*\)$/) {
s=ixiy($4)
printf("%04d I%04X LD %s,%s%s)\n",NR,addr,$3,substr($4,1,3),s) >tmp
addr+=3
next
}
if($3~/^\(I[XY].*\)$/) {
if($4~r) {
t=$4
a=addr+3
} else {
if($4~/^[0-9]/) {
n=tonum($4)
t=sprintf("%04X",n%256)
} else
t="@l" $4
a=addr+4
}
s=ixiy($3)
printf("%04d I%04X LD %s%s),%s\n",NR,addr,substr($3,1,3),s,t) >tmp
addr=a
next
}
}
op~/^(ADD|ADC|SBC)$/ && $3=="A" {
if($4~r) {
printf("%04d I%04X %-5sA,%s\n",NR,addr,op,$4) >tmp
addr++
next
}
if($4~/^\(I[XY].*\)$/) {
s=ixiy($4)
printf("%04d I%04X %-5sA,%s%s)\n",NR,addr,op,substr($4,1,3),s) >tmp
addr+=3
next
}
}
op~/^(SUB|AND|XOR|OR|CP)$/ {
if($3~r) {
printf("%04d I%04X %-5s%s\n",NR,addr,op,$3) >tmp
addr++
next
}
if($3~/^\(I[XY].*\)$/) {
s=ixiy($3)
printf("%04d I%04X %-5s%s%s)\n",NR,addr,op,substr($3,1,3),s) >tmp
addr+=3
next
}
}
op~/^(INC|DEC)$/ {
if($3~r) {
printf("%04d I%04X %-5s%s\n",NR,addr,op,$3) >tmp
addr++
next
} else if($3~/^\(I[XY].*\)$/) {
s=ixiy($3)
printf("%04d I%04X %-5s%s%s)\n",NR,addr,op,substr($3,1,3),s) >tmp
addr+=3
next
}
}
op~/^(RLC|RRC|RL|RR|SLA|SRA|SRL)$/ {
if($3~r) {
printf("%04d I%04X %-5s%s\n",NR,addr,op,$3) >tmp
addr+=2
} else if($3~/^\(I[XY].*\)$/) {
s=ixiy($3)
printf("%04d I%04X %-5s%s%s)\n",NR,addr,op,substr($3,1,3),s) >tmp
addr+=4
} else error(2,NR)
next
}
op~/^(BIT|RES|SET)$/ && $3~/^[0-7]$/ {
if($4~r) {
printf("%04d I%04X %-5s%s,%s\n",NR,addr,op,$3,$4) >tmp
addr+=2
} else if($4~/^\(I[XY].*\)$/) {
s=ixiy($4)
printf("%04d I%04X %-5s%s,%s%s)\n",NR,addr,op,$3,substr($4,1,3),s) >tmp
addr+=4
} else error(2,NR)
next
}
op!~oc {error(1,NR)}
$3!="" {
if($3~r1) {
op=op $3
opr1=$3
} else if($3~/^\(.+\)$/) {
fl=1
l=$3
gsub(/^\(|\)$/,"",l)
op=op"(?)"
opr1="(?)"
} else {
fl=1
l=$3
op=op"?"
opr1="?"
}
}
$4!="" {
if($4~r2) {
op=op $4
opr2=$4
} else if($4~/^\(.+\)$/) {
fl=1
l=$4
gsub(/^\(|\)$/,"",l)
op=op"(?)"
opr2="(?)"
} else {
fl=1
l=$4
op=op"?"
opr2="?"
}
}
{ if(!(op in ob)) error(2,NR)
a=addr+ob[op]
if($3=="") {
printf("%04d I%04X %s\n",NR,addr,$2)>tmp
addr=a
next
}
else if($4=="") opr=sprintf("%s",opr1)
else opr=sprintf("%s,%s",opr1,opr2)
if(l~/^[0-9]/) l=sprintf("%04X",tonum(l))
else l=sprintf("@l%s",l)
sub(/\?/,l,opr)
printf("%04d I%04X %-5s%s\n",NR,addr,$2,opr) >tmp
addr=a
}
END {
print"" >tmp
for(s in st) printf("%04X %s\n",st[s],s) >tmp
close(tmp)
if(errf==1) exit
printf("パス2の処理中‥‥\n\n") >err
while(getline<tmp >0 && $0!="") {
for(i=3;i<=NF;i++) {
if(!(j=index($i,"@"))) continue
nr=substr($i,j+1,1)
l=substr($i,j+2)
sub(/\)$/,"",l)
if(!(l in st)) error(3,$1)
n=st[l]
addr=tonum("0"substr($2,2)"H")
if(nr=="l")
if($3~/^(JR|DJNZ)$/) {
e=n-(addr+2)
if(e>127||e<-128) error(4,$1)
$i=sprintf("@%04X",n)
} else {
sub(/@.+$/,sprintf("%04X",n),$i)
if(j>1) $i=$i ")"
}
else if(nr~/^[+-]$/) {
if(nr=="-") n=-n
if(n<-128||n>255) error(5,$1)
if(n<0) n+=256
d=sprintf("%02X",n)
sub(/@.+$/,d")",$i)
} else {
$i=sprintf("%02X",n%256)
if(nr=="2") {
printf("%s %s %s\n",$1,$2,$3)
$2=sprintf("D%04X",++addr)
$i=sprintf("%02X",int(n/256))
}
}
}
n=$1+0
if(n==qn) {
printf("%s %s %s\n",$1,$2,$3)
continue
}
if($4=="") s=sprintf("%s %s %-s",$1,$2,$3)
else if($5=="") s=sprintf("%s %s %-5s%s",$1,$2,$3,$4)
else s=sprintf("%s %s %-5s%s,%s",$1,$2,$3,$4,$5)
i=length(s)
print s rep(" ",31-i) ";" ol[n]
qn=n
}
}
function tonum(s, i,m,n,c) {
if(s!~/^[0-9]/) return 0
if(s!~/H$/) return s+0
m=length(s)
for(i=1;i<m;i++) {
c=substr(s,i,1)
if(c!~/^[0-9A-F]$/) return n
n=16*n+h[c]
}
return n
}
function ixiy(s) {
l=substr(s,4);sub(/.$/,"",l)
if(l=="") l="+0"
if(l!~/^[+-]/) error(2,NR)
pm=substr(l,1,1);sub(/^./,"",l)
if(l~/^[0-9]/) {
n=tonum(l)
if(pm=="-") n=-n
if(n<-128||n>255) error(5,NR)
if(n<0) n+=256
return sprintf("%02X",n)
} else return ("@" pm l)
}
function rep(c,n, s) {
while(n-->0) s=s c
return s
}
function error(i,s) {
print em[i] ": " s " 行" >err
errf=1
exit
}